'use strict'

angular.module('pl.utils', ['underscore'])

.factory('$plUtils', ['$cookies', function($cookies){

	var uuid = function (len, radix) {
	    var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
	    var uuid = [], i;
	    radix = radix || chars.length;
	 
	    if (len) {
	      // Compact form
	      for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];
	    } else {
	      // rfc4122, version 4 form
	      var r;
	 
	      // rfc4122 requires these characters
	      uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
	      uuid[14] = '4';
	 
	      // Fill in random data.  At i==19 set the high bits of clock sequence as
	      // per rfc4122, sec. 4.1.5
	      for (i = 0; i < 36; i++) {
	        if (!uuid[i]) {
	          r = 0 | Math.random()*16;
	          uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
	        }
	      }
	    }
	 
	    return uuid.join('');
	}

	var toHex = function (num) {
		if (!num) {
			throw new Error('You must specify an Int value.');
		}

		return '0x' + num.toString(16);
	}

	/*
		Process cookie
	*/
	var getCookie = function (key, isSerialized) {
		if (!key) {
			return;
		}

		isSerialized = isSerialized || false;

		if (isSerialized) {
			return $cookies.getObject(key);
		} else {
			return $cookies.get(key);
		}
	}

	var setCookie = function (key, val, options, isSerialized) {
		if (!key) {
			throw new Error('You must specify a key.');
		}

		val = val || '';
		options = options || {};
		isSerialized = isSerialized || false;

		if (isSerialized) {
			$cookies.putObject(key, val, options);
		} else {
			$cookies.put(key, val, options);
		}
	}

	var getAllCookie = function () {
		return $cookies.getAll();
	}

	var removeCookie = function (keys, options) {
		if (!keys) {
			throw new Error('You must specify a key.');
		}

		keys = (keys instanceof Array)? keys : new Array().push(keys);

		options = options || {};

		_.each(keys, function(key){
			$cookies.remove(key, options);
		})
	}

	return {
		uuid: uuid,
		toHex: toHex,
		cookies: {
			get: getCookie,
			set: setCookie,
			remove: removeCookie,
			getAll: getAllCookie
		}
	}
}])